#ifndef _DATAQUEUE_H_
#define _DATAQUEUE_H_

#include <pthread.h>
#include "common.h"



/*****************************/
/*can数据接收队列*/
typedef struct cantask
{
    unsigned int id;
    char data[8];
    unsigned int len;
    struct cantask *next;          //下一个工作
} Cthread_cantask;

/*工作队列*/
typedef struct cansendworkqueue
{
    pthread_mutex_t queue_lock; //互斥锁
    pthread_cond_t  queue_ready;//条件变量
    pthread_t *queuethreadid;         //发送线程id

    /*链表结构，线程池中所有等待任务*/
    Cthread_cantask *queue_head;

    /*当前等待的任务数*/
    int cur_queue_size;

} Cthread_canworkqueue;

/********************************/

/*uart数据接收队列*/
typedef struct uarttask
{
    uint8_t data[UART_CMD_LENGTH];
    struct uarttask *next;          //下一个工作
} Cthread_uarttask;

/*工作队列*/
typedef struct uartsendworkqueue
{
    pthread_mutex_t queue_lock; //互斥锁
    pthread_cond_t  queue_ready;//条件变量
    pthread_t *queuethreadid;         //发送线程id

    /*链表结构，线程池中所有等待任务*/
    Cthread_uarttask *queue_head;

    /*当前等待的任务数*/
    int cur_queue_size;

} Cthread_uartworkqueue;

/***************************/

/*eth数据接收队列*/
typedef struct ethtask
{
    char data[ETH_CMD_LENGTH];
    struct ethtask *next;          //下一个工作
} Cthread_ethtask;

/*工作队列*/
typedef struct ethsendworkqueue
{
    pthread_mutex_t queue_lock;     //互斥锁
    pthread_cond_t  queue_ready;    //条件变量
    pthread_t *queuethreadid;       //发送线程id   
    Cthread_ethtask *queue_head;    //链表结构，线程池中所有等待任务   
    int cur_queue_size;             //当前等待的任务数

} Cthread_ethworkqueue;

/****************************/
typedef struct udptask
{
    char data[UDP_CMD_LENGTH];
    uint8_t len;
    char destip;        //远端IP地址：192.168.1.destip
    uint16_t destport;  //远端端口号
    struct udptask *next;
} Cthread_udptask;

typedef struct udpsendworkqueue
{
    pthread_mutex_t queue_lock;     //互斥锁
    pthread_cond_t  queue_ready;    //条件变量
    pthread_t *queuethreadid;       //发送线程id   
    Cthread_udptask *queue_head;    //链表结构，线程池中所有等待任务   
    int cur_queue_size;             //当前等待的任务数

}Cthread_udpworkqueue;

extern Cthread_canworkqueue *cansendqueue;      //can发送队列结构体
extern Cthread_uartworkqueue *uartsendqueue;    //uart发送队列
extern Cthread_ethworkqueue *ethsendqueue;      //eth发送工作队列
extern Cthread_udpworkqueue *udpsendqueue;     //udp发送工作队列

extern Cthread_canworkqueue *canrecvqueue;      //can接收工作队列
extern Cthread_uartworkqueue *uartrecvqueue;    //uart接收工作队列
extern Cthread_ethworkqueue *ethrecvqueue;      //eth接收工作队列

void can_add_task(Cthread_canworkqueue *canqueue,const CANTxMsg_t *msg);
void uart_add_task(Cthread_uartworkqueue *uartqueue,char *buff);
void eth_add_task(Cthread_ethworkqueue *ethqueue,char *buff);
void udp_add_task(uint8_t destip,uint16_t destport, const char *buff, char len);
//int get_canrecvqueue_data(Cthread_canworkqueue *canqueue, CANTxMsg_t *msg);

void queue_init(void);

#endif